perm filename SLICE.OLD[GEO,BGB]1 blob sn#081319 filedate 1974-01-15 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE SLICE
C00003 00003	SUBR(VMARK,BODY,ZCUT)
C00005 00004	SUBR(SLICE,EDGE,ZCUT)
C00009 ENDMK
C⊗;
TITLE SLICE

EXTERN ESPLIT,INVERT,OTHER,VCCW,MKFE,ECCW
SUBR(VMARK,BODY,ZCUT)
	ACCUMULATORS{V,PDEL,NDEL,E,E0}

;CLEAR THE NZZ AND PZZ BITS OF ALL THE EDGES AND VERTICES.
	SLACI(PZZ+NZZ)↔LAC 1,BODY
	ANDCAM(1)↔PVT 1,1↔CAME 1,BODY↔GO .-3
	ANDCAM(1)↔PED 1,1↔CAME 1,BODY↔GO .-3

;POSITIVE AND NEGATIVE EPSILON.
	LAC PDEL,ZCUT↔FADR PDEL,[0.01]
	LAC NDEL,ZCUT↔FSBR NDEL,[0.01]

;FORCE THE VERTICES TO BE ABOVE OR BELOW THE SLICE PLANE.
	LAC V,BODY
L1:	PVT V,V↔CAMN V,BODY↔POP2J
L2:	LAC ZWC(V)
	CAML PDEL↔GO[MARK V,PZZ↔GO L3]
	CAMG NDEL↔GO[MARK V,NZZ↔GO L3]
	FSBR ZCUT
	SKIPL ↔DAC PDEL,ZWC(V)
	SKIPGE↔DAC NDEL,ZWC(V)↔GO L2

;MARK THE EDGES OF THIS VERTEX AS PZZ OR NZZ.
L3:	PED E,V↔LAC E0,E
L4:	PVT 1,E↔CAME 1,V↔GO .+3↔PCW 1,E↔GO L5	   ;AC1 ← ECCW(E,V).
	NVT 1,E↔CAME 1,V↔GO L1 ↔NCW 1,E
L5:	IORM 0,(E)↔LAC E,1			;AC0 CONTAINS THE BIT.
	CAME E,E0↔GO L4↔GO L1
ENDR VMARK;1/11/74(BGB)----------------------------------------------
SUBR(SLICE,EDGE,ZCUT)
	ACCUMULATORS{V1,V2,DX,DY,DZ}

;TEST FOR EDGE CROSSING THE SLICE PLANE.
	LAC 1,EDGE
	TEST 1,PZZ↔POP2J
	TEST 1,NZZ↔POP2J

;INITIALIZATION.
	SETOM FLAG			;FIRST TIME THRU -1 FLAG.
	DAC 1,E↔NVT 2,1↔TEST 2,PZZ
	GO[CALL(INVERT,E)↔GO .+1]	;FORCE NVT(E) INTO PZZ HALF-SPACE.
	LAC 1,E↔NFACE 1,1
	DAC 1,F0↔DAC 1,F		;FIRST FACE.

;SPLIT EDGE - SO THAT PVT(E) IS IN NZZ HALF SPACE.
L1:	LAC 1,E↔MARKZ 1,PZZ+NZZ
	NVT V1,1↔PVT V2,1↔PUSH P,V2↔PUSH P,V1	;SAVE OLDE VERTICES.
	TEST V1,PZZ↔GO[CALL(INVERT,E)↔GO .+1]	;FORCE NVT(E) INTO PZZ.
	SETQ(U2,{ESPLIT,E})

;COMPUTE LOCUS WHERE E INTERSECTS THE SLICE PLANE.
	POP P,V1↔POP P,V2			;RESTORE OLDE VERTICES.
	LAC DX,XWC(V2)↔FSBR DX,XWC(V1)
	LAC DY,YWC(V2)↔FSBR DY,YWC(V1)
	LAC DZ,ZWC(V2)↔FSBR DZ,ZWC(V1)
	LAC ZCUT↔FSBR ZWC(V1)↔FDVR DZ			;COEFFICIENT K.
	FMPR DX,0↔FADR DX,XWC(V1)↔DAC DX,XWC(1)
	FMPR DY,0↔FADR DY,YWC(V1)↔DAC DY,YWC(1)
	FMPR DZ,0↔FADR DZ,ZWC(V1)↔DAC DZ,ZWC(1)

;SPLIT FACE.
	AOSG FLAG↔GO[LAC U2↔DAC U0↔GO L2]		;1ST TIME ONLY.
	CALL(MKFE,U2,F,U1)

;ADVANCE INTO THE NEXT FACE & FIND NEXT CROSSING EDGE.
L2:	LAC U2↔DAC U1
	SETQ(F,{OTHER,E,F})
	CAMN 1,F0↔GO[CALL(MKFE,U0,F,U1)↔POP2J]	;EXIT
L3:	SETQ(E,{ECCW,E,F})
	TEST 1,NZZ↔GO L3↔GO L1

DECLARE{F,E,U0,U1,U2,F0,FLAG}
ENDR SLICE;1/11/74(BGB)----------------------------------------------
END